package com.kerwin.exception;

import com.kerwin.entity.returnjson.AxiosResultGenerics;
import com.kerwin.entity.returnjson.E;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/*这是个复合注解*/
/*@ControllerAdvice 对控制层做增强织入 异常通知 控制层通知增强*/
/*因为spring调用方法，都是反射调用的*/
/*记得自己写的那个框架吗，反射找到类  请求参数里面包含方法名字   反射实例调用方法*/
/*这个就是在方法前后左右加了四个通知*/

/*这里就相当于*/
/**
 * try(){
 * 我的方法
 * }catch(Exception e){
 * 这里就是这个类的地方
 * }
 * */
/*出了异常就进入这个类*/
/*之后的异常都要往上抛，在这里统一处理*/
@RestControllerAdvice

public class GlobalExceptionHandler {

    /*同时把异常信息写入日志*/
    private Logger l= LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(HandlerException.class)
    /**
     * 因为这里相当于
     * catch(Exception e){
     *  * 这里就是这个类的地方
     *  * }
     *  所以直接有e 这个对象，写在形参里面就可以
     * */
    public <T> AxiosResultGenerics<Void> doHandlerException(HandlerException e){
        /*这个get的是枚举对象里面的E e*/
        E e1 = e.getE();
        /*计入日志*/
        /*自定义的异常里面居然有堆栈信息 就是这个e 打印出来*/
        l.error(e1.getMsg(),e);
        return AxiosResultGenerics.ERROR(e1);

    }

    /*妈的这个狗币热加载，还是maven clean的原因啊*/
    /*之前的除0异常竟然进不了这里面*/
    @ExceptionHandler(Exception.class)
        public  AxiosResultGenerics<Void> doException(Exception e ){
        /*打印我自己提示的错误信息*/
            l.error(E.COVER_THE_BOTTOM.getMsg());
            /*e.getMessage()  打印除0异常错误信息  by zero*/
            /*e就是堆栈了*/
            l.error(e.getMessage(),e);
            return AxiosResultGenerics.ERROR(E.COVER_THE_BOTTOM);
        }

}
